
package application.CommunicationModule;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;

import application.ClientCommunicationModule.ClientDatabase;
import application.client.data.Client;
import application.client.data.Address;
import application.parcelModule.Parcel;
import application.parcelModule.ParcelDatabase;

public class Communication {

	String user;
	String password;
	Connection connection;
	
	private Client clients;
	private static ArrayList<Client> list;
	private static ClientDatabase cb;
	
	private Parcel parcel;
	private static ArrayList<Parcel> parcelList;
	private static ParcelDatabase parcelDataBase;

	/*********************************************************************/
	/*************************** Constructors ***************************/
	/*******************************************************************/
	 public Communication(String user, String password) throws ClassNotFoundException, SQLException{
		 this.user = user; 
		 this.password = password;
		  
		 //połaczenie
		 Class.forName("org.postgresql.Driver");      
		 this.connection = DriverManager.getConnection("jdbc:postgresql://stevie.heliohost.org:5432/inzynier_ProjektIO", user, password); 
		
		 //konstruktor modułu ClientCommunication
		 cb = new ClientDatabase(connection);
		 list = new ArrayList<Client>();
		 
		//konstruktor modułu ParcelDatabase
		 parcelDataBase = new ParcelDatabase(connection);
		 parcelList = new ArrayList<Parcel>();
		  
	 };
	 
	 
	 
	/*********************************************************************/
	/***********    Methods ClientDataBase    ***************************/
	/*******************************************************************/
	 
	/**
	* metoda zwraca liste wszystkich klientów
	*/
	public ArrayList<Client> getAllclients() throws SQLException
	{
		return cb.getAllClients();
	}
	
	/**
	* metoda zwraca liste wszystkich klientów którzy spełniaja warunek nazwa_pola = wartość  (field = value)
	*/
	public ArrayList<Client> getClientsByField(String field, String value) throws SQLException{
		if(cb.getClientsByField(field,value)){
			list=(cb.getClientList());
		}
		return list;
	}
	
	/**
	* metoda dodaje nowego klienta
	*/
	public int addNewClient(String company, String lastName,String firstName, String email, String phoneNumber, Address adress) throws SQLException{
		Client client = new Client(getAllclients().size(),company,lastName,firstName, email, phoneNumber, adress);
		cb.addClient(client);
		list.clear();
		list = getAllclients();
		return list.get(list.size()-1).getClientID();
	}
	
	/**
	* metoda dodaje liste klientów ??? POPRAWIĆ
	*/
	public static boolean addNewClients(ArrayList<Client> ClientsList) throws SQLException{
		cb.setClientList(ClientsList);
		if(cb.addClients())return true;
		return false;
	}
	
	/**
	* metoda modyfikuje klienta
	*/
	public static boolean modifyClient(String company, String lastName,String firstName, String email, String phoneNumber, Address adress) throws SQLException{
		Client client = new Client(company,lastName,firstName, email, phoneNumber, adress);
		return cb.modifyClient(client);
	}
	
	/**
	* metoda usuwa kolienta o numerze Id
	*/
	public static boolean deleteClient (int ClientID) throws SQLException{
		if(cb.deleteClient(ClientID)) return true;
		return false;	
	}
	
	/*********************************************************************/
	/*****************    Methods ParcelDataBAse    *********************/
	/*******************************************************************/
	
	
	/**
	 * Zwraca wszystkie informacje o wszystkich paczkach
	 */
	public ArrayList<Parcel> getAllParcel() throws SQLException {
		parcelList = parcelDataBase.getAllParcel();
		return parcelList;  
	}
	
	/**
	 * Zwraca wszystkie informacje o Paczce o okreslonym numerze id
	 */
	public Parcel getParcelById(int ID) throws SQLException{
		return parcelDataBase.getParcelById(ID);
	}
	
	
	/**
	 * Zwraca numer statusu (status z tabeli Parcel) Paczki o okreslonym id,
	 * jeśli wystąpi błąd numer statustu będzie równy zero
	 */
	public int getStatusFromParcelById(int Id) throws SQLException{
		int nrStatus=0;
		nrStatus = parcelDataBase.getStatusFromParcelById(Id);
		return nrStatus;
	}
	
	/**
	 * (Dodał Witek)
	 * Zwraca słowny status Paczki o okreslonym id,
	 */
	public String getParcelStatus(int Id) throws SQLException{
		int nrStatus=0;
		nrStatus = parcelDataBase.getStatusFromParcelById(Id);
		if (nrStatus!=-1)
			return getStatus(nrStatus);
		else
			return ("Nie znaleziono paczki w systemie");
	}
	
	/**
	 * Zwraca informacje o Paczkach z okreslona data
	 */
	public ArrayList<Parcel> getParcelsByDate(String dateee) throws SQLException{
		parcelList = parcelDataBase.getParcelsByDate(dateee);
		return parcelList;
	}
	
	/**
	 * Zwraca informacje o Paczkach ktore maja zadany typ
	 */
	public ArrayList<Parcel> getParcelsByType(String typeee) throws SQLException{
		parcelList.clear();
		parcelList = parcelDataBase.getParcelsByType(typeee);
		return parcelList;
	}
	
	/**
	 * Zwraca informacje o Paczkach ktora ma okreslony status
	 */
	public ArrayList<Parcel> getParcelsByStatus(int statuss) throws SQLException{
		parcelList.clear();
		parcelList = parcelDataBase.getParcelsByStatus(statuss);
		return parcelList;
	}
	
	
	/**
	 * Zwraca informacje o Paczkach ktore wyslal dany nadawca
	 * Zakladamy ze klientem jest tym co wysyla SENDER
	 */
	public ArrayList<Parcel> getParcelsByClient(int clientID) throws SQLException{
		parcelList = parcelDataBase.getParcelsByClient(clientID);
		return parcelList;
	}
	
	
	/**
	 * Zwraca informacje o Paczkach ktore ma otrzymac dany odbiorca
	 */
	public ArrayList<Parcel> getParcelsByRecipent(int recipienttId) throws SQLException{
		parcelList = parcelDataBase.getParcelsByRecipent(recipienttId);
		return parcelList;
	}
	
	/**
	 * Zwraca informacje o Paczkach o podanej cenie przesylki
	 */
	public ArrayList<Parcel> getParcelsByPrice(int pricee) throws SQLException{
		parcelList.clear();
		parcelList = parcelDataBase.getParcelsByPrice(pricee);
		return parcelList;
	}
	
	/**
	 * Zwaraca nazwe statusu po podaniu id statusu    //TA METODA DWA RAZY
	 */
	public String getStatus(int id_statusu) throws SQLException{
		String status = new String();
		status = parcelDataBase.getStatus(id_statusu);
		return status;
	}
	
	
	/**
	 * Zwaraca liste wszystkich statusów
	 */
	public ArrayList<String> getStatusList(){
		try {
			return parcelDataBase.getStatusList();
		} catch (SQLException e) {
			
			e.printStackTrace();
			return new ArrayList<String>();
		}
	}
	
	/**
	* metoda modyfikuje paczkę
	*/
	public boolean modifyParcel(Parcel p){
		try {
			return parcelDataBase.modifyParcel(p);
		} catch (SQLException e) {
			
			e.printStackTrace();
			return false;
		}
	}
	
	/**
	* metoda modyfikuje paczkę ale o innych parametach 
	*/
	public boolean modifyParcel(String date,String type,int status,int sender,int recipient,int width,int height,int length,int mass, int price) throws SQLException{
		Parcel parcel = new Parcel(parcelDataBase.getCurrentID(),date,type,status,sender,recipient, width, height, length, mass, price);
		return parcelDataBase.modifyParcel(parcel);
	}
	
	/**
	* metoda modyfikuje status paczki
	*/
	public boolean modifyParcelStatus(int parcelID, int status){
		try {
			return parcelDataBase.modifyParcelStatus(parcelID, status);
		} catch (SQLException e) {
			
			e.printStackTrace();
			return false;
		}
	}
	
	
	/**
	 * Dodawanie Paczki
	 * zwraca id paczki (ktora teraz dodal)
	 */
	public boolean addParcels() throws SQLException{
		return parcelDataBase.addParcels();
	}
	
	/**
	 * Dodawanie Paczki
	 */
	public int addParcel(String date,String type,int status,int sender,int recipient,int width,int height,int length,int mass, int price) throws SQLException{
		Parcel parcel = new Parcel(parcelDataBase.getCurrentID(),date,type,status,sender,recipient, width, height, length, mass, price);
		return parcelDataBase.addParcel(parcel);
	}

	/**
	 * Usuwa pojedyncza paczke z tabelei dla konkretnego id
	 */
	public boolean deleteParcel(int id) throws SQLException{
		if(parcelDataBase.deleteParcel(id)){
			return true;
		}else{
			return false;
		}
	}
	public Connection getConnection() {
		return connection;
	}
	public void setConnection(Connection connection) {
		this.connection = connection;
	}

	/*//zwraca adres id klienta 
	public static int getAdressCliendID(int clientID) throws SQLException{
		int addressID = 0;
		addressID = cb.getAddressID(clientID);
		return addressID;
	}  
	
	public static int getCurrentID(String relation) throws SQLException{
		int maxID = 0;
		maxID = cb.getCurrentID(relation);
		return maxID;
	}
	*/
}

